<?php

namespace Modules\Buy\Entities;

use Illuminate\Database\Eloquent\Model;

class Catego extends Model
{
    protected $guarded=[];

//    使用树状图
    public function cateTree($catego=null){

        //获取所有分类数据
        $data = Catego::get()->toArray();
        $result = \houdunwang\arr\Arr::tree($data, 'name', 'id', 'pid');
//        在这里判断它有没有同类，有同类就不让它选择
        if ($catego){
//            循环数据判断他是哪个级别
//            dump($catego->toArray());
            foreach ($result as $k=>$v){
//                dump($v);
                if ($catego['id']==$v['id']){
                    $catego = $v;
//                    dump($catego);
                }
            }
            foreach ($result as $k=>$v){
                $result[$k]['_disabled'] = $v['_level']>=$catego['_level'] ? 'disabled':'';
            }
        }

        return $result;

    }

//    使用数组增强判断是否有子栏目
    public function haslanmu($id){
        $data = Catego::get()->toArray();
//        dd($data);
        return \houdunwang\arr\Arr::hasChild($data, $id,'pid');
    }

//    使用数组增强看打印子分类
    public function getsoncate()
    {
        $cate = Catego::get()->toArray();
        $res = \houdunwang\arr\Arr::channelLevel($cate, $pid = 0, $html = "&nbsp;", 'id', 'pid');
        return $res;
    }

//    获取分类数据，往商品列表页循环展示
    public function sonson($cid,$searchattrids,$brandid)
    {


        $attrgood = [];
//        定义一个空数组，用于存放商品选择好的属性
        $goodsselect = [];
        //定义一个空数组，用来接收筛选后的商品id
        $searchGoodsIds = [];
//        下面开始做判断
//        已知分类id，求属性分类
//        dd($cid);


        $zicate = Catego::where('pid',$cid['id'])->first();
        if ($zicate){
            $erzi = Catego::where('pid',$zicate['id'])->first();
            if ($erzi){
//                一级分类下的子分类
                $er = Catego::where('pid',$cid['id'])->pluck('id');
                $san = Catego::whereIn('pid',$er)->pluck('id');
//        dd($san);
                $good = Good::whereIn('cate_id',$san)->paginate(10);
//                dd($good->toArray());
                $attrid = Catearr::whereIn('cid',$san)->pluck('aid');
                $attrid = array_unique($attrid->toArray());


//                一级分类的筛选




            }else{



//                二级分类下的子分类
                $son = Catego::where('pid',$cid['id'])->pluck('id');
//                如果是二级分类怎么拿属性
                $attrid = Catearr::whereIn('cid',$son)->pluck('aid');
//                dd($attrid);
                $attrid = array_unique($attrid->toArray());
//                dd($attrid);



//                判断二级分类筛选
                if ($searchattrids){
                    //去商品表中找到分类在$son这个三级分类id数组里面的商品id
                    $shangpinid = Good::whereIn('cate_id',$son)->pluck('id');
                    //找到所有对应商品的货品
                    $huopinattrs = Huowu::whereIn('good_id',$shangpinid)->get();
                    foreach ($huopinattrs as $k => $v) {
                        $newArr = explode(',', $v['attr']);
                        $newAttr = array_unique(array_merge($newArr, explode(',', $searchattrids)));
                        if ($newArr == $newAttr) {
                            //如果找到了要找到数据,就将对应货品数据中的商品id拿出来
                            $goodsselect[] = $v['good_id'];
                        }
                    }
                    //对商品id去重
                    $goodsselect = array_unique($goodsselect);
                    //获取在$goodsselect数组内的商品数据
                    $good = Good::whereIn('id', $goodsselect)->paginate(1);

                }else{
                    $good = Good::whereIn('cate_id', $son)->paginate(10);
                }

            }
        }else{
            //判断如果选择了属性，就进入if获取数据
            if ($searchattrids){

//                获得三级分类
                $zishuixng = explode(',',$searchattrids);
//                dd($zishuixng);
                $sanid = Good::where('cate_id',$cid['id'])->pluck('id');
//                dd($sanid);
                if ($brandid){
                    //选了属性也选择了品牌
                    //获取商品表中分类id等于当前三级分类的，并且品牌等于当前选择品牌的商品id
                    $goodsids = Good::where('cate_id',$cid['id'])->where('brand_id',$brandid)->pluck('id');
                    //找到货品表中商品id在上面商品id数组中的货品的属性组合
                    $huopinzuhe = Huowu::whereIn('good_id',$goodsids)->get();
                    //将传递过来的筛选的属性切割成数组
                    $searchArr = explode(',',$searchattrids);
                    foreach ($huopinzuhe as $k => $v) {
                        //将每个货品的属性组合切割成数组
                        $huowuattr = explode(',',$v['attr']);
                        //用每个切割成数组的属性和选择的切割成数组的合并去重
                        $hebingArr = array_unique(array_merge($huowuattr,$searchArr));
                        //判断原来的属性组合数组是否和合并去重后的数组相同，如果相同，代表筛选的属性当前货品有，那么我们就将该货品的商品id放入一个数组中
                        if ($huowuattr == $hebingArr){
                            $searchGoodsIds[] = $v['good_id'];
                        }
                    }
                    $searchGoodsIds = array_unique($searchGoodsIds);
                    //最后找到商品id在上面id数组中的商品数据
                    $good = Good::whereIn('id',$searchGoodsIds)->paginate(1);
                }else{
                    //选了属性没有选择品牌
                    //                根据对应的属性id找到对应的商品数据，找到商品id就可以找到货品了
                    $huowu = Huowu::whereIn('good_id',$sanid)->get();
//                找到对应的货品
//                dd($huowu->toArray());
//                循环获得的所有货物,转成数组，合并去重，和原来的进行比较，相同就代表找对了，如果不同就是代表不是
                    foreach ($huowu as $k=>$v){
//                    按逗号把属性切割出来
                        $xinshuxing = explode(',',$v['attr']);
//                    然后去重
                        $newAttr = array_unique(array_merge($xinshuxing, explode(',', $searchattrids)));
                        if ($xinshuxing == $newAttr) {
                            //如果找到了要找到数据,就将对应货品数据中的商品id拿出来
                            $goodsselect[] = $v['good_id'];
                        }
                    }

//                把重复的商品进行去重
                    $goodsselect = array_unique($goodsselect);
//                    最后获得对应的id的商品数据
                    $good = Good::whereIn('id',$goodsselect)->paginate(1);
                }

            }else {
                if ($brandid){
                    //没选属性也选择了品牌
                    //找到商品表中，分类id等于当前三级分类的，并且品牌等于当前选择的品牌id的商品
                    $good = Good::where('cate_id',$cid['id'])->where('brand_id',$brandid)->paginate(1);
                }else{
                    //没选属性没有选择品牌
                    //如果没有选择属性，从这里获取数据
                    $good = Good::where('cate_id', $cid['id'])->paginate(10);
                }

            }

//            如果是三级分类，直接根据取属性
            $attrid = Catearr::where('cid',$cid['id'])->pluck('aid');
//            dd($attr);
        }

        $attr = Arr::whereIn('id',$attrid)->get();
//        循环获得子属性
        foreach ($attr as $k => $v){
            $attr[$k]['son'] = Arr::where('pid',$v['id'])->get()->toArray();
        }
        $attrgood['attr'] = $attr;
        $attrgood['good'] = $good;
//        dd($good->toArray());
//        dd($attrgood);



        return $attrgood;


    }

}